當我們呼叫一個函數時,實際上是向目標合約發送了一段 "calldata",而這段 "calldata" 會包含很多資訊,其中的前 4 個位元組被稱為 "selector"(函數選擇器)
"msg.data" 是一個全域變數,它包含了完整的 "calldata",也就是呼叫函數時傳入的資料
0x6a6278420000000000000000000000002c44b726adf1963ca47af88b284c06f30380fc78
這段雜亂的位元組碼可以分成兩部分
"0x6a627842"
函數選擇器的類型也被稱為方法 ID(method id)。方法 ID 定義為函數簽名的 Keccak 哈希後的前 4 個位元組,當 selector 與方法 ID 相匹配時,表示呼叫該函數。方法簽名的格式是 "函數名(逗號分隔的參數類型)"。
你可以使用 "abi.encodeWithSelector" 將方法 ID 作為 selector 和參數打包編碼,然後傳遞給 "call" 函數以呼叫目標函數。這樣,你可以透過函數選擇器來確定要呼叫哪個函數。
WTF Solidity Selector
4byte Directory
Sig Samczsun